In the old days, when writing requirements, the systems engineer would encode choices about which were imperative and which were optional. The most important requirements began; “The system SHALL…" or "The system MUST…”.
Well it occurred to me some years ago that with enough time most systems could be made to meet all their requirements no matter how fluffy. So why not cast the requirements in the present tense as if the system already existed. Then use the implementation schedule to determine the importance. The high priority requirements come first then the secondary requirements come later. Then change control boards determine the priority by use of the schedule. This has three benefits; First: Shall, Must, Should and May are not granular enough to specify the staging of complex systems.
Second, requirements in the present tense can easily be integrated into other documentation. Consider the utility of the following two expressions of the same requirement.
Third the language is much more pleasant. Some people can get pretty heavy handed. When bandying about language with shall statements all day, well, it just gives them a reason to be mean.
One of a systems engineer's favorite responses to questions is; it depends. Every answer is contingent on issues a systems engineer must consider. So one of the reasons I get so bent out of shape about SHALL statements is that they sound so contradictory in the context of multiple version development. Let me explain.
I was once responsible for the architecture of several loosely coupled applications that had a multi-decade life cycle. The needs list for the sum of them exceeded 10000 documented reports. I was constantly working on 4 versions of each of them.
For example; one application was due to release version 6 at the end of the quarter. So this was normal development. Version 5.5 had just been released and would have a few maintenance releases (you know the 5.5.1.2.3 stuff) associated with it. Version 5.4 was most widely distributed to the customer base and needed periodic requirements level adjustments that had to get to the field fast. Meanwhile, many of the important features would be released in version 7. Big features have long lead times and a lot of thinking and planning goes into them. So, though I did not spend a lot of time thinking about version 7, I had to have a place to write requirements about it.
So try to imagine the life of a single feature attribute across versions 5.4, 5.5, 6 and 7.
In version 5.4 it must complete in 45 seconds.
In version 5.5, 30 seconds, in version 6, 10 seconds and in version 7 it is merged with another feature and must complete in 15 seconds.
I insisted on all versions being in one Interleaf document that could be filtered by release.
so a set of requirements with their IDs looked like this;
[mmm70] Feature x SHALL complete in 45 seconds.
[mmm91] Feature x SHALL complete in 30 seconds.
[mmm120] Feature x SHALL complete in 10 seconds.
[mmm144] Feature x and y SHALL complete in 15 seconds.
when the full document was printed.
It just looks stupid.
Now when you add release information it makes more sense.
[mmm70](v5.4-5.5) Feature x completes in 45 seconds.
[mmm91](v5.5-6.0) Feature x completes in 30 seconds.
[mmm120](v6.0-7.0) Feature x completes in 10 seconds.
[mmm144](v7.0-) Feature x and y complete in 15 seconds.
In Interleaf, I could print the requirements introduced since release 6.0 made obsolete in release 7.0 which would display just the next to last line. This made adding, merging, withdrawing and moving features quite manageable over long tracts of time.
So, the idea of SHALL being relative, seems contradictory and I make it a habit to minimize contradictions.